package com.thread;

import lombok.extern.slf4j.Slf4j;

import static java.lang.Thread.sleep;

/**
 * join方法详解
 */
@Slf4j
public class JoinMethod {
    static int r = 0;
    static int r1 = 0;
    static int r2 = 0;

    public static void main(String[] args) throws Exception {
        //test1();
        //test2();
        //test3();
        test4();
    }

    /**
     * 这个方法打印出的r的值并不是我们赋值后的10，而是0
     * 因为刚开始的时候，t1线程等待1s后执行，而主线程直接执行，打印出r，也就是0
     * 这种情况下，我们需要让主线程等待和t1线程进行同步，这样就能得到r赋值后我们想要的值，如test2
     */
    public static void test1() {
        log.debug("开始");
        Thread t1 = new Thread(() -> {
            log.debug("开始");
            try {
                sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("结束");
            r = 10;
        });
        t1.start();
        log.debug("结果为:{}", r);
        log.debug("结束");
    }

    /**
     * 这个方法调用了join方法，所以主线程会等待线程1执行完毕，再进行输出，结果为10
     *
     * @throws InterruptedException
     */
    public static void test2() throws InterruptedException {
        log.debug("开始");
        Thread t1 = new Thread(() -> {
            log.debug("开始");
            try {
                sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("结束");
            r = 10;
        });
        t1.start();
        t1.join();
        log.debug("结果为:{}", r);
        log.debug("结束");
    }

    /**
     * 等待一段时间，过了这个时间，直接执行主线程
     *
     * @throws Exception
     */
    public static void test3() throws Exception {
        Thread t1 = new Thread(() -> {
            try {
                sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            r1 = 10;
        });
        t1.start();
        t1.join(2);
        log.debug("结果为:{}", r1);
    }

    /**
     * 没等够
     *
     * @throws Exception
     */
    public static void test4() throws Exception {
        Thread t1 = new Thread(() -> {
            try {
                sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            r1 = 10;
        });
        t1.start();
        t1.join(1);
        log.debug("结果为:{}", r1);
    }
}
